"segment errors" statements about memory access out-of-bounds errors.
The following describes several debugging methods for a program with a segment error:
1 dummy_function (void)
2 {
3 unsigned char * ptr = 0x00;
4 * ptr = 0x00;
5}
6
7 int main (void)
8 {
9 dummy_function ();
10
11 return 0;
12}
As a skilled C/C ++ programmer, the bug of the above Code should be very clear, because it tries to operate on the memory area with the address 0, this memory area is usually inaccessible, and of cou
}67 int main (void)8 {9 dummy_function ();1011 return 0;12}As a skilled C/C ++ programmer, the bug of the above Code should be very clear, because it tries to operate on the memory area with the address 0, this memory area is usually inaccessible, and of course there will be errors. Let's compile and run it:Xiaosuo @ gentux test $./A. OutSegment ErrorAs expected, it went wrong and exited.1. Use GDB to gradually find the segment error:This method is al
"segment errors" statements about "segment error", a memory access error that is out of bounds.Several debugging methods are described below for a program that has a section error:1 dummy_function (void)2 {3 unsigned char *ptr = 0x00;4 *ptr = 0x00;5}67 int main (void)8 {9 dummy_function ();10return 0;12}
The bug in the code above should be very clear as a skilled C + + programmer, because it tries to manipulate the memory area with address 0, which is usually an inaccess
When we write programs in C/C ++, most of the work of memory management needs to be done. In fact, memory management is a tedious task. No matter how clever and experienced you are, it is inevitable that you will make some small errors here. These errors are usually so simple and easy to eliminate. However, manual debugging is often inefficient and annoying, this article will talk about how to quickly locate these "segment errors" statements about memory access out-of-bounds errors.
The followin
:
1 dummy_function (void)2 {3 unsigned char * ptr = 0x00;4 * ptr = 0x00;5}67 int main (void)8 {9 dummy_function ();1011 return 0;12}
As a skilled C/C ++ programmer, the bug of the above Code should be very clear, because it tries to operate on the memory area with the address 0, this memory area is usually inaccessible, and of course there will be errors. Let's compile and run it:
Xiaosuo @ gentux test $./a. outSegment Error
memory management needs to be done. In fact, memory management is a tedious task. No matter how clever and experienced you are, it is inevitable that you will make some small errors here. These errors are usually so simple and easy to eliminate. However, manual debugging is often inefficient and annoying, this article will talk about how to quickly locate these "segment errors" statements about memory access out-of-bounds errors.
The following describes several debugging methods for a program
:
Xiaosuo @ gentux test $./A. OutSegment Error
As expected, it went wrong and exited.1. Use GDB to gradually find the segment error:This method is also widely known and widely used. First, we need an executable program with debugging information. Therefore, we add the "-g-rdynamic" parameter to compile the program, use GDB to debug and run the newly compiled program. The specific steps are as follows:
xiaosuo @
For multi-threaded applications, if you can name each thread, the convenience of debugging is self-evident.Today, I read the weekly report on lwn and saw someone adding the interface named by prctl to other threads in the process. I learned that the interface named for the thread already exists, then write the following verification code:
#include #include #include void* tmain(void *arg) { char name[32]; prctl(PR_SET_NAME, (unsigned long)"xx"); prctl(PR_GET_NAME, (unsigned long)name); printf("%s
eliminate. However, manual debugging is often inefficient and annoying, this article will talk about how to quickly locate these "segment errors" statements about memory access out-of-bounds errors.
The following describes several debugging methods for a program with a segment error:
1 dummy_function (void)2 {3 unsigned char * ptr = 0x00;4 * ptr = 0x00;5}67 int main (void)8 {9 dummy_function ();1011 return 0;12}
As a skilled C/C ++ programmer, the bug of the above Code should be
, usually, when the daemon starts, there are not many file descriptors to open, so it is not worth a week for a few descriptors. As a result, I turned my evil little brain and made the following strange tricks:
Int close_all_fd (void)
{
DIR * dir;
Struct dirent * entry, _ entry;
Int retval, rewind, fd;
Dir = opendir ("/dev/fd ");
If (dir = NULL)
Return-1;
Rewind = 0;
While (1 ){
Retval = readdir_r (dir, _ entry, entry );
If (retval! = 0 ){
Errno =-retval;
Retval =-1;
Break;
}
If (entry = NULL
epoch-making process (process number 1) Init is not killed either, regardless of its oom_adj value. Originally only the process of system resource management permission (Cap_sys_resource) can make the adjustment of the Oom_adj value, now if it is to the process of the possibility of being killed does not need any special authority, we also really should not deprive it of suicide or its owner intentionally put it onto the cliff right.
The specific actions that prohibit a process from being kill
killed increases exponentially. In addition, the first process (process no. 1) Init is not in the kill list, regardless of its oom_adj value. In the past, only the process with system resource management permissions (cap_sys_resource) can adjust the oom_adj value. If the process is killed, no special permissions are required, we should not deprive it of suicide or the right of its owner to put it on a cliff.
The specific actions to prevent a process from being killed are as follows:
Ro
probability of killing them increases exponentially. In addition, the first process in the beginning of the day is 1) init is not included in the list, regardless of its oom_adj value. It turns out that only the process with the system resource management permission CAP_SYS_RESOURCE can adjust the oom_adj value. If the process is killed, no special permissions are required, we should not deprive it of suicide or the right of its owner to put it on a cliff.
The specific actions to prevent a proc
". In fact, I learned how C/C ++ source code is converted into executable files step by step during programming in Linux.In general, the C/C ++ source code can be converted into executable files on the corresponding platform only after four steps: preprocessing, compilation, assembly, and connection. Most of the time, the programmer can complete the above four steps through a single command. For example, the following section C's "Hello world !" Code:File: HW. c# Include stdio. h>Int main (INT
and annoying, and this article talks about how to quickly locate these "segment errors" statements about "segment error", a memory access error that is out of bounds.
Several debugging methods are described below for a program that has a section error:
Dummy_function (void)
{
unsigned char *ptr = 0x00;
*ptr = 0x00;
}
int main (void)
{
dummy_function ();
return 0;
}
The bug in the code above should be very clear as a skilled C + + programmer, because
where the module is located. After successful execution, we can get the desired module (hello. Ko.If a module has many source files, such as hello, which are connected by hello1.c hello2.c, add the following lines to makefile:Hello-objs: = hello1.o hello2.oLkm LoadingLinux provides modutils for users to manipulate modules. This tool set mainly includes:Insmod installation ModuleRmmod Delete ModuleModprobe is more advanced in loading and deleting modules, which can solve the dependencies between
Currently, the common methods for setting socket connection timeout for each platform are as follows:
Create a socket and set it to a non-blocking state.
Call connect to connect the peer host. If the connection fails, check whether errno is einprogress at the time, that is, whether the connection is in progress. If yes, go to step 3. If no, an error is returned.
Use the SELECT statement to listen to the write-ready event of the socket within the specified timeout period. If the SELECT statem
. After successful execution, we can get the desired module (hello. Ko.
If a module has many source files, such as hello, which are connected by hello1.c hello2.c, add the following lines to makefile:
hello-objs:= hello1.o hello2.o
Lkm Loading
Linux provides modutils for users to manipulate modules. This tool set mainly includes:
Insmod installation ModuleRmmod Delete ModuleModprobe is more advanced in loading and deleting modules, which can solve the dependencies between modules.Lsmod lists the
modules under this directory, just add them after hello.o.Obj-m: = hello.o mod.o execute make in the directory where the module is located, and then we can get the module (HELLO.KO) We want after the success.If a module has many source files, such as Hello, which is connected by hello1.c hello2.c, you need to add the following line to the makefileHELLO-OBJS: = hello1.o hello2.olkm LoadingLinux provides users with the Modutils to manipulate modules. This toolset mainly includes:Insmod Install mo
Contact Us
The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion;
products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the
content of the page makes you feel confusing, please write us an email, we will handle the problem
within 5 days after receiving your email.
If you find any instances of plagiarism from the community, please send an email to:
info-contact@alibabacloud.com
and provide relevant evidence. A staff member will contact you within 5 working days.